#ifndef TIPOSOBSTACULOS_H_
#define TIPOSOBSTACULOS_H_

#include <iostream>
#include "string.h"
#include "TipoObstaculo.h"
#include "Lista.h"
#include "PuntosDeGrillaConMismaTexturaException.h"
#include "TipoYaExisteException.h"
using namespace std;

class TiposObstaculos : public Lista<TipoObstaculo*> , public ObjetoModelo {

public:
	TiposObstaculos(){
		this->setNombreClase("TiposObstaculos");
	}
	/*
	Si el Tipo de Obstaculo de nombre n esta dentro de la lista devuelve true,
	en caso contrario devuelve false
	*/

	bool yaEstaTipo(string n){
		IteradorLista<TipoObstaculo*> iterador = this->iterador();
		bool esta = false;
		while ((iterador.tieneSiguiente())  &&  (!esta)){
			TipoObstaculo* unTipoObstaculo = iterador.siguiente();
			esta = (unTipoObstaculo->getNombre()==n);
		}
		return esta;
	}

	bool yaEstaTextura(string t){
		IteradorLista<TipoObstaculo*> iterador = this->iterador();
		bool esta = false;
		while ((iterador.tieneSiguiente())  &&  (!esta)){
			TipoObstaculo* unTipoObstaculo = iterador.siguiente();
			esta = (unTipoObstaculo->getTextura()==t);
		}
		return esta;
	}


	void agregarObjeto(ObjetoModelo* om) throw(...) {
		if(om->getNombreClase()=="TipoObstaculo"){
			if(yaEstaTextura(((TipoObstaculo*)om)->getTextura())){
				throw new PuntosDeGrillaConMismaTexturaException();
			}
			if(yaEstaTipo(((TipoObstaculo*)om)->getNombre())){
				throw new TipoYaExisteException();
			}
			this->agregar((TipoObstaculo*)om);
		}
		else {
				throw new AtributoDesconocidoException(om->getNombreClase());
			}
		}
};
#endif